package com.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.MediaType;

import java.util.Collections;


/*
  为什么要禁用循环引用？
  答：假如list中重复添加了两个Object对象，在没关闭循环引用的前提下，输出list，从第二个Object开始显示的都是乱码，这明显不是我们想看到的。
  所以要关闭循环引用，这样所有的Object我们都可以看到
  */

/**
 * json信息转换配置类：把后端数据转换成某种风格的json格式展现给前端
 * 引入Fastjson解析json，不使用默认的jackson https://www.jianshu.com/p/333ed5ee958d
 */
@Configuration
public class JsonHttpMessageConvertConfig {

    @Bean
    @Primary //让这个注入类的优先级高一点
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        //1、定义一个convert转换消息的对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //2、添加fastjson的配置信息
        FastJsonConfig fastJsonConfig = new FastJsonConfig();

        String dateFormat = "yyyy-MM-dd HH:mm:ss";
        // 设置日期格式
        fastJsonConfig.setDateFormat(dateFormat);

        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.MapSortField,
                SerializerFeature.DisableCircularReferenceDetect
        );
        //  3、在converter中添加配置信息，converter就会根据配置里的要求依法序列化数据格式
        fastConverter.setFastJsonConfig(fastJsonConfig);
        fastConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
        return new HttpMessageConverters(fastConverter);
    }
}
